// 定义的一些静态类
import {USER_TYPE} from '@/common/constants'
//  封装了  操作  window.localStorage 的方法,set(存入数据) 和get(获取数据)方法
import storage from '@/common/storage'
import api from '@/common/api'
// vue状态管理
const state = {
    // 从localStorage 中获取 userInfo
    userInfo: storage.get('userInfo'),
    // 从localStorage 中获取 token
    token: localStorage.getItem('token'),
    // 登录失败次数
    loginFailNum: 0,
    // 未读消息数量
    unreadMessage: {
        // 评论
        comment: 0,
        // 回复
        reply: 0,
        // 点赞
        like: 0,
        // 系统消息
        sys: 0,
        // 自己的消息
        mine: 0
    }
}
// 获取数据

const getters = {
    // 获取用户信息
    userInfo: state => state.userInfo || {},
    // 获取token
    token: state => state.token || '',
    // 未读消息数量
    unreadMessage: state => state.unreadMessage || {},
    // 登录失败次数
    loginFailNum: state => state.loginFailNum || 0,
    // 是否登录
    isAuthenticated: (state, getters) => {
        return !!getters.token
    },
    // 是否是管理员
    isAdminRole: (state, getters) => {
        if (getters.userInfo.roleList) {
            // 当角色包含 problem_admin 或者 admin 或者root的就是管理员
            return getters.userInfo.roleList.indexOf(USER_TYPE.ADMIN) != -1 ||
                getters.userInfo.roleList.indexOf(USER_TYPE.PROBLEM_ADMIN) != -1 ||
                getters.userInfo.roleList.indexOf(USER_TYPE.SUPER_ADMIN) != -1
        } else {
            return false;
        }
    },
    // 是否超级管理员(角色包含root的)
    isSuperAdmin: (state, getters) => {
        if (getters.userInfo.roleList) {
            return getters.userInfo.roleList.indexOf(USER_TYPE.SUPER_ADMIN) != -1
        } else {
            return false;
        }
    },
    // 是否是题目管理员(角色包含problem_admin的)
    isProblemAdmin: (state, getters) => {
        if (getters.userInfo.roleList) {
            return getters.userInfo.roleList.indexOf(USER_TYPE.PROBLEM_ADMIN) != -1
        } else {
            return false;
        }
    },
}
// 改变状态
const mutations = {
    // 更新用户信息
    changeUserInfo(state, {userInfo}) {
        state.userInfo = userInfo
        storage.set('userInfo', userInfo)
    },
    // 更新token
    changeUserToken(state, token) {
        state.token = token
        localStorage.setItem("token", token)
    },
    // 失败登录次数加1
    incrLoginFailNum(state, {success}) {
        if (!success) {
            state.loginFailNum += 1
        } else {
            state.loginFailNum = 0
        }
    },
// 清除用户信息和token信息
    clearUserInfoAndToken(state) {
        state.token = ''
        state.userInfo = {}
        state.loginFailNum = 0
        storage.clear()
    },
    // 更新未读消息数量
    updateUnreadMessageCount(state, {unreadMessage}) {
        state.unreadMessage = unreadMessage
    },
    // 减去未读消息数量
    substractUnreadMessageCount(state, {needSubstractMsg}) {
        // 负数也没关系
        state.unreadMessage[needSubstractMsg.name] = state.unreadMessage[needSubstractMsg.name] - needSubstractMsg.num;
    },
    // 更新用户权限信息
    changeUserAuthInfo(state, {roles}) {
        state.userInfo.roleList = roles;
        storage.set('userInfo', state.userInfo);
    }
}
// 改变状态的方法
const actions = {
    // 设置用户信息
    setUserInfo({commit}, userInfo) {
        commit('changeUserInfo', {
            userInfo: userInfo
        })
    },
    // 设置失败登录次数
    incrLoginFailNum({commit}, success) {
        commit('incrLoginFailNum', {success: success})
    },
    // 清空用户信息和token
    clearUserInfoAndToken({commit}) {
        commit('clearUserInfoAndToken')
    },
    // 设置 未读消息数量
    updateUnreadMessageCount({commit}, unreadMessage) {
        commit('updateUnreadMessageCount', {
            unreadMessage: unreadMessage
        })
    },
    // 减去 未读消息数量
    substractUnreadMessageCount({commit}, needSubstractMsg) {
        commit('substractUnreadMessageCount', {
            needSubstractMsg: needSubstractMsg
        })
    },
    // 刷新用户权限信息
    refreshUserAuthInfo({commit, dispatch}) {
        return new Promise((resolve, reject) => {
            api.getUserAuthInfo().then((res) => {
                commit('changeUserAuthInfo', {roles: res.data.data.roles})
                resolve(res)
            })
        }, err => {
            reject(err)
        })
    }
}
// 暴漏方法
export default {
    state,
    getters,
    actions,
    mutations
}
